home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_400 / 411_02 / vim / src / digraph.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-12-13  |  8.1 KB  |  346 lines

  1. /* vi:ts=4:sw=4
  2.  *
  3.  * VIM - Vi IMproved
  4.  *
  5.  * Code Contributions By:    Bram Moolenaar            mool@oce.nl
  6.  *                            Tim Thompson            twitch!tjt
  7.  *                            Tony Andrews            onecom!wldrdg!tony 
  8.  *                            G. R. (Fred) Walter        watmath!watcgl!grwalter 
  9.  */
  10.  
  11. #ifdef DIGRAPHS
  12. /*
  13.  * digraph.c: code for digraphs
  14.  */
  15.  
  16. #include "vim.h"
  17. #include "globals.h"
  18. #include "proto.h"
  19. #include "param.h"
  20.  
  21. static void printdigraph __ARGS((u_char *));
  22.  
  23. u_char    (*digraphnew)[3];            /* pointer to added digraphs */
  24. int        digraphcount = 0;            /* number of added digraphs */
  25.  
  26. #ifdef MSDOS
  27. u_char    digraphdefault[][3] =         /* standard MSDOS digraphs */
  28.        {{'C', ',', 128},    /* Ç */
  29.         {'u', '"', 129},    /* ü */
  30.         {'e', '\'', 130},    /* é */
  31.         {'a', '^', 131},    /* â */
  32.         {'a', '"', 132},    /* ä */
  33.         {'a', '`', 133},    /* à */
  34.         {'a', '@', 134},    /* å */
  35.         {'c', ',', 135},    /* ~G (SAS C can't handle the real char) */
  36.         {'e', '^', 136},    /* ~H (SAS C can't handle the real char) */
  37.         {'e', '"', 137},    /* ë */
  38.         {'e', '`', 138},    /* è */
  39.         {'i', '"', 139},    /* ï */
  40.         {'i', '^', 140},    /* î */
  41.         {'i', '`', 141},    /* ì */
  42.         {'A', '"', 142},    /* Ä */
  43.         {'A', '@', 143},    /* Å */
  44.         {'E', '\'', 144},    /* É */
  45.         {'a', 'e', 145},    /* æ */
  46.         {'A', 'E', 146},    /* Æ */
  47.         {'o', '^', 147},    /* ô */
  48.         {'o', '"', 148},    /* ö */
  49.         {'o', '`', 149},    /* ò */
  50.         {'u', '^', 150},    /* û */
  51.         {'u', '`', 151},    /* ù */
  52.         {'y', '"', 152},    /* ÿ */
  53.         {'O', '"', 153},    /* Ö */
  54.         {'U', '"', 154},    /* Ü */
  55.         {'c', '|', 155},    /* ¢ */
  56.         {'$', '$', 156},    /* £ */
  57.         {'Y', '-', 157},    /* ~] (SAS C can't handle the real char) */
  58.         {'P', 't', 158},    /* ₧ */
  59.         {'f', 'f', 159},    /* ƒ */
  60.         {'a', '\'', 160},    /* á */
  61.         {'i', '\'', 161},    /* í */
  62.         {'o', '\'', 162},    /* ó */
  63.         {'u', '\'', 163},    /* xx (SAS C can't handle the real char) */
  64.         {'n', '~', 164},    /* ñ */
  65.         {'N', '~', 165},    /* Ñ */
  66.         {'a', 'a', 166},    /* ª */
  67.         {'o', 'o', 167},    /* º */
  68.         {'~', '?', 168},    /* ¿ */
  69.         {'-', 'a', 169},    /* ⌐ */
  70.         {'a', '-', 170},    /* ¬ */
  71.         {'1', '2', 171},    /* ½ */
  72.         {'1', '4', 172},    /* ¼ */
  73.         {'~', '!', 173},    /* ¡ */
  74.         {'<', '<', 174},    /* « */
  75.         {'>', '>', 175},    /* » */
  76.  
  77.         {'s', 's', 225},    /* ß */
  78.         {'j', 'u', 230},    /* µ */
  79.         {'o', '/', 237},    /* φ */
  80.         {'+', '-', 241},    /* ± */
  81.         {'>', '=', 242},    /* ≥ */
  82.         {'<', '=', 243},    /* ≤ */
  83.         {':', '-', 246},    /* ÷ */
  84.         {'~', '~', 247},    /* ≈ */
  85.         {'~', 'o', 248},    /* ° */
  86.         {'2', '2', 253},    /* ² */
  87.         {NUL, NUL, NUL}
  88.         };
  89.  
  90. #else    /* MSDOS */
  91.  
  92. u_char    digraphdefault[][3] =         /* standard ISO digraphs */
  93.        {{'~', '!', 161},    /* í */
  94.         {'c', '|', 162},    /* ó */
  95.         {'$', '$', 163},    /* ú */
  96.         {'o', 'x', 164},    /* ñ */
  97.         {'Y', '-', 165},    /* Ñ */
  98.         {'|', '|', 166},    /* ª */
  99.         {'p', 'a', 167},    /* º */
  100.         {'"', '"', 168},    /* ¿ */
  101.         {'c', 'O', 169},    /* ⌐ */
  102.         {'a', '-', 170},    /* ¬ */
  103.         {'<', '<', 171},    /* ½ */
  104.         {'-', ',', 172},    /* ¼ */
  105.         {'-', '-', 173},    /* ¡ */
  106.         {'r', 'O', 174},    /* « */
  107.         {'-', '=', 175},    /* » */
  108.         {'~', 'o', 176},    /* ░ */
  109.         {'+', '-', 177},    /* ▒ */
  110.         {'2', '2', 178},    /* ▓ */
  111.         {'3', '3', 179},    /* │ */
  112.         {'\'', '\'', 180},    /* ┤ */
  113.         {'j', 'u', 181},    /* ╡ */
  114.         {'p', 'p', 182},    /* ╢ */
  115.         {'~', '.', 183},    /* ╖ */
  116.         {',', ',', 184},    /* ╕ */
  117.         {'1', '1', 185},    /* ╣ */
  118.         {'o', '-', 186},    /* ║ */
  119.         {'>', '>', 187},    /* ╗ */
  120.         {'1', '4', 188},    /* ╝ */
  121.         {'1', '2', 189},    /* ╜ */
  122.         {'3', '4', 190},    /* ╛ */
  123.         {'~', '?', 191},    /* ┐ */
  124.         {'A', '`', 192},    /* └ */
  125.         {'A', '\'', 193},    /* ┴ */
  126.         {'A', '^', 194},    /* ┬ */
  127.         {'A', '~', 195},    /* ├ */
  128.         {'A', '"', 196},    /* ─ */
  129.         {'A', '@', 197},    /* ┼ */
  130.         {'A', 'E', 198},    /* ╞ */
  131.         {'C', ',', 199},    /* ╟ */
  132.         {'E', '`', 200},    /* ╚ */
  133.         {'E', '\'', 201},    /* ╔ */
  134.         {'E', '^', 202},    /* ╩ */
  135.         {'E', '"', 203},    /* ╦ */
  136.         {'I', '`', 204},    /* ╠ */
  137.         {'I', '\'', 205},    /* ═ */
  138.         {'I', '^', 206},    /* ╬ */
  139.         {'I', '"', 207},    /* ╧ */
  140.         {'D', '-', 208},    /* ╨ */
  141.         {'N', '~', 209},    /* ╤ */
  142.         {'O', '`', 210},    /* ╥ */
  143.         {'O', '\'', 211},    /* ╙ */
  144.         {'O', '^', 212},    /* ╘ */
  145.         {'O', '~', 213},    /* ╒ */
  146.         {'O', '"', 214},    /* ╓ */
  147.         {'/', '\\', 215},    /* ╫ */
  148.         {'O', '/', 216},    /* ╪ */
  149.         {'U', '`', 217},    /* ┘ */
  150.         {'U', '\'', 218},    /* ┌ */
  151.         {'U', '^', 219},    /* █ */
  152.         {'U', '"', 220},    /* ▄ */
  153.         {'Y', '\'', 221},    /* ▌ */
  154.         {'I', 'p', 222},    /* ▐ */
  155.         {'s', 's', 223},    /* ▀ */
  156.         {'a', '`', 224},    /* α */
  157.         {'a', '\'', 225},    /* ß */
  158.         {'a', '^', 226},    /* Γ */
  159.         {'a', '~', 227},    /* π */
  160.         {'a', '"', 228},    /* Σ */
  161.         {'a', '@', 229},    /* σ */
  162.         {'a', 'e', 230},    /* µ */
  163.         {'c', ',', 231},    /* τ */
  164.         {'e', '`', 232},    /* Φ */
  165.         {'e', '\'', 233},    /* Θ */
  166.         {'e', '^', 234},    /* Ω */
  167.         {'e', '"', 235},    /* δ */
  168.         {'i', '`', 236},    /* ∞ */
  169.         {'i', '\'', 237},    /* φ */
  170.         {'i', '^', 238},    /* ε */
  171.         {'i', '"', 239},    /* ∩ */
  172.         {'d', '-', 240},    /* ≡ */
  173.         {'n', '~', 241},    /* ± */
  174.         {'o', '`', 242},    /* ≥ */
  175.         {'o', '\'', 243},    /* ≤ */
  176.         {'o', '^', 244},    /* ⌠ */
  177.         {'o', '~', 245},    /* ⌡ */
  178.         {'o', '"', 246},    /* ÷ */
  179.         {':', '-', 247},    /* ≈ */
  180.         {'o', '/', 248},    /* ° */
  181.         {'u', '`', 249},    /* ∙ */
  182.         {'u', '\'', 250},    /* · */
  183.         {'u', '^', 251},    /* √ */
  184.         {'u', '"', 252},    /* ⁿ */
  185.         {'y', '\'', 253},    /* ² */
  186.         {'i', 'p', 254},    /* ■ */
  187.         {'y', '"', 255},    /*   */
  188.         {NUL, NUL, NUL}
  189.         };
  190. #endif    /* MSDOS */
  191.  
  192. /*
  193.  * handle digraphs after typing a character
  194.  */
  195.     int
  196. dodigraph(c)
  197.     int        c;
  198. {
  199.     static int    backspaced;        /* character before BS */
  200.     static int    lastchar;        /* last typed character */
  201.  
  202.     if (c == -1)        /* init values */
  203.     {
  204.         backspaced = -1;
  205.     }
  206.     else if (p_dg)
  207.     {
  208.         if (backspaced >= 0)
  209.             c = getdigraph(backspaced, c);
  210.         backspaced = -1;
  211.         if (c == BS && lastchar >= 0)
  212.             backspaced = lastchar;
  213.     }
  214.     lastchar = c;
  215.     return c;
  216. }
  217.  
  218. /*
  219.  * lookup the pair char1, char2 in the digraph tables
  220.  * if no match, return char2
  221.  */
  222.     int
  223. getdigraph(char1, char2)
  224.     int    char1;
  225.     int    char2;
  226. {
  227.     int        i;
  228.     int        retval;
  229.  
  230.     retval = 0;
  231.     for (i = 0; ; ++i)            /* search added digraphs first */
  232.     {
  233.         if (i == digraphcount)    /* end of added table, search defaults */
  234.         {
  235.             for (i = 0; digraphdefault[i][0] != 0; ++i)
  236.                 if (digraphdefault[i][0] == char1 && digraphdefault[i][1] == char2)
  237.                 {
  238.                     retval = digraphdefault[i][2];
  239.                     break;
  240.                 }
  241.             break;
  242.         }
  243.         if (digraphnew[i][0] == char1 && digraphnew[i][1] == char2)
  244.         {
  245.             retval = digraphnew[i][2];
  246.             break;
  247.         }
  248.     }
  249.  
  250.     if (retval == 0)    /* digraph deleted or not found */
  251.         return char2;
  252.     return retval;
  253. }
  254.  
  255. /*
  256.  * put the digraphs in the argument string in the digraph table
  257.  * format: {c1}{c2} char {c1}{c2} char ...
  258.  */
  259.     void
  260. putdigraph(str)
  261.     char *str;
  262. {
  263.     int        char1, char2, n;
  264.     u_char    (*newtab)[3];
  265.     int        i;
  266.  
  267.     while (*str)
  268.     {
  269.         skipspace(&str);
  270.         char1 = *str++;
  271.         char2 = *str++;
  272.         if (char1 == 0 || char2 == 0)
  273.             return;
  274.         skipspace(&str);
  275.         if (!isdigit(*str))
  276.         {
  277.             emsg(e_number);
  278.             return;
  279.         }
  280.         n = getdigits(&str);
  281.         if (digraphnew)        /* search the table for existing entry */
  282.         {
  283.             for (i = 0; i < digraphcount; ++i)
  284.                 if (digraphnew[i][0] == char1 && digraphnew[i][1] == char2)
  285.                 {
  286.                     digraphnew[i][2] = n;
  287.                     break;
  288.                 }
  289.             if (i < digraphcount)
  290.                 continue;
  291.         }
  292.         newtab = (u_char (*)[3])alloc(digraphcount * 3 + 3);
  293.         if (newtab)
  294.         {
  295.             memmove((char *)newtab, (char *)digraphnew, (size_t)(digraphcount * 3));
  296.             free(digraphnew);
  297.             digraphnew = newtab;
  298.             digraphnew[digraphcount][0] = char1;
  299.             digraphnew[digraphcount][1] = char2;
  300.             digraphnew[digraphcount][2] = n;
  301.             ++digraphcount;
  302.         }
  303.     }
  304. }
  305.  
  306.     void
  307. listdigraphs()
  308. {
  309.     int        i;
  310.  
  311.     printdigraph(NULL);
  312.     for (i = 0; digraphdefault[i][0]; ++i)
  313.         if (getdigraph(digraphdefault[i][0], digraphdefault[i][1]) == digraphdefault[i][2])
  314.             printdigraph(digraphdefault[i]);
  315.     for (i = 0; i < digraphcount; ++i)
  316.         printdigraph(digraphnew[i]);
  317.     outchar('\n');
  318.     wait_return(TRUE);
  319. }
  320.  
  321.     static void
  322. printdigraph(p)
  323.     u_char *p;
  324. {
  325.     char        buf[9];
  326.     static int    len;
  327.  
  328.     if (p == NULL)
  329.         len = 0;
  330.     else if (p[2] != 0)
  331.     {
  332.         if (len > Columns - 11)
  333.         {
  334.             outchar('\n');
  335.             len = 0;
  336.         }
  337.         if (len)
  338.             outstrn("   ");
  339.         sprintf(buf, "%c%c %c %3d", p[0], p[1], p[2], p[2]);
  340.         outstrn(buf);
  341.         len += 11;
  342.     }
  343. }
  344.  
  345. #endif /* DIGRAPHS */
  346.